const Validator = {
    myInteger(min,max){//验证正整数
        let valid=(rule, value,callback)=> {
            if (!value) {
                callback()
            } else {
                let reg = /^([1-9]\d*|[0]{1,1})$/
                if (!reg.test(value)) {
                    callback(new Error('只能输入正整数'))
                } else if (min!=undefined && max!=undefined) {
                    if (value < min || value > max) {
                        callback(new Error('数据只能在' + min + '到' + max + '范围内'))
                    }
                    else {
                        callback()
                    }
                }
                else {
                    callback()
                }
            }
        }
        return valid;
    },
    myAmount(min,max){//验证金额
        var valid=(rule, value,callback)=>{
            if(!value){
                callback()
            }else{
                //var reg=/^(?:(?:(?:[1-9]\d{0,2}(?:,\d{3})*)|[1-9]\d*|0))(?:\.\d{1,2})?$/;//可以3位加逗号
                var reg=/^(0|([1-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/;//只能整数或两位小数
                if(!reg.test(value)){
                    callback(new Error('金额格式不正确'))
                }else if (min!=undefined && max!=undefined) {
                    if (value < min || value > max) {
                        callback(new Error('数据只能在' + min + '到' + max + '范围内'))
                    }
                    else {
                        callback()
                    }
                }else if(value>9999999999999.99){
                    callback(new Error('金额整数部分不能大于13位数'))
                }
                else {
                    callback()
                }
            }
        }
        return valid;
    },
    myPhone(){//验证电话：座机和手机
        var valid=(rule, value,callback)=>{
            if(!value){
                callback()
            }else{
                var reg=/^((0\d{2,3}-\d{7,8})|(1\d{10}))$/
                if(!reg.test(value)){
                    callback(new Error('请输入11位手机号码或区号-座机号'))
                }else{
                    callback()
                }
            }
        }
        return valid;
    },
    myMobile(){//验证电话:手机
        var valid=(rule, value,callback)=>{
            if(!value){
                callback()
            }else{
                var reg=/^1\d{10}$/
                if(!reg.test(value)){
                    callback(new Error('请输入11位手机号码'))
                }else{
                    callback()
                }
            }
        }
        return valid;
    },
    myTelephone(){//验证电话：座机
        var valid=(rule, value,callback)=>{
            if(!value){
                callback()
            }else{
                var reg=/^0\d{2,3}-\d{7,8}$/
                if(!reg.test(value)){
                    callback(new Error('请输入区号-座机号'))
                }else{
                    callback()
                }
            }
        }
        return valid;
    },
    myNumber(min,max){//验证数字
        var valid=(rule, value,callback)=>{
            if(!value){
                callback()
            }else{
                var reg=/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/
                if(!reg.test(value)){
                    callback(new Error('数字格式不正确'))
                }else if (min!=undefined && max!=undefined) {
                    if (value < min || value > max) {
                        callback(new Error('数据只能在' + min + '到' + max + '范围内'))
                    }
                    else {
                        callback()
                    }
                }else if(value>=10000000000000){
                    callback(new Error('整数部分不能大于13位数'))
                }
                else {
                    callback()
                }
            }
        }
        return valid;
    },
    myEmail(){//验证邮箱
        var valid=(rule, value,callback)=>{
            if(!value){
                callback()
            }else{
                var reg=/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
                if(!reg.test(value)){
                    callback(new Error('邮箱格式不正确'))
                }else{
                    callback()
                }
            }
        }
        return valid;
    },
    myUrl(){//验证url
        var valid=(rule, value,callback)=>{
            if(!value){
                callback()
            }else{
                var reg=/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i
                if(!reg.test(value)){
                    callback(new Error('url格式不正确'))
                }else{
                    callback()
                }
            }
        }
        return valid;
    },
    myIdentityCodeValid(){
        var valid=(rule, code, callback) => {
            var city = {
                11: "北京",
                12: "天津",
                13: "河北",
                14: "山西",
                15: "内蒙古",
                21: "辽宁",
                22: "吉林",
                23: "黑龙江 ",
                31: "上海",
                32: "江苏",
                33: "浙江",
                34: "安徽",
                35: "福建",
                36: "江西",
                37: "山东",
                41: "河南",
                42: "湖北 ",
                43: "湖南",
                44: "广东",
                45: "广西",
                46: "海南",
                50: "重庆",
                51: "四川",
                52: "贵州",
                53: "云南",
                54: "西藏 ",
                61: "陕西",
                62: "甘肃",
                63: "青海",
                64: "宁夏",
                65: "新疆",
                71: "台湾",
                81: "香港",
                82: "澳门",
                91: "国外 "
            };
            var pass = true;
            if (!code) {
                callback(new Error('请输入身份证号'))
            }

            if (!/^[1-9]\d{5}((1[89]|20)\d{2})(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dx]$/i.test(code)) {
                callback(new Error('身份证号格式错误'))
            } else if (!city[code.substr(0, 2)]) {
                callback(new Error('地址编码错误'))
            } else {
                //18位身份证需要验证最后一位校验位
                if (code.length == 18) {
                    code = code.split('');
                    //∑(ai×Wi)(mod 11)
                    //加权因子
                    var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
                    //校验位
                    var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
                    var sum = 0;
                    var ai = 0;
                    var wi = 0;
                    for (var i = 0; i < 17; i++) {
                        ai = code[i];
                        wi = factor[i];
                        sum += ai * wi;
                    }
                    var last = parity[sum % 11];
                    if (parity[sum % 11] != code[17]) {
                        callback(new Error('校验位错误'))
                    } else {
                        callback()
                    }
                }
            }
        }
        return valid;
    }
}

// 对Validator的实例重新封装成一个plugin ,方便 Vue.use(xxxx)
export default {
    install: function(Vue, Option) {
        Object.defineProperty(Vue.prototype, "$valid", { value: Validator });
    }
};
